/**
 * 小程序上传API测试脚本
 * 演示如何调用上传接口
 */

const axios = require('axios');

// 配置服务地址
const API_BASE_URL = 'http://localhost:3000';

// API密钥
const API_SECRET_KEY = 'yueqiankejiyueqiankejiyueqiankeji';

// 测试数据
const testData = {
    appid: 'wx1234567890abcdef',
    privateKey: `-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC...
(这里是完整的私钥内容)
...
-----END PRIVATE KEY-----`,
    backendDomain: 'api.example.com',
    uniacid: 123,
    entryPagePath: 'pages/index/index'
};

/**
 * 测试健康检查接口
 */
async function testHealth() {
    try {
        console.log('🔍 测试健康检查接口...');
        const response = await axios.get(`${API_BASE_URL}/health`);
        console.log('✅ 健康检查成功:', response.data);
        return true;
    } catch (error) {
        console.error('❌ 健康检查失败:', error.message);
        return false;
    }
}

/**
 * 测试上传接口
 */
async function testUpload() {
    try {
        console.log('🚀 测试上传接口...');
        console.log('请求参数:', {
            ...testData,
            privateKey: '***隐藏私钥内容***'
        });
        
        const response = await axios.post(`${API_BASE_URL}/upload`, testData, {
            headers: {
                'X-API-Key': API_SECRET_KEY
            },
            timeout: 300000 // 5分钟超时
        });
        
        console.log('✅ 上传成功:', response.data);
        return true;
    } catch (error) {
        console.error('❌ 上传失败:');
        if (error.response) {
            console.error('状态码:', error.response.status);
            console.error('错误信息:', error.response.data);
        } else {
            console.error('网络错误:', error.message);
        }
        return false;
    }
}

/**
 * 参数验证测试
 */
async function testValidation() {
    try {
        console.log('🧪 测试参数验证...');
        
        // 1. 测试缺少API密钥
        try {
            await axios.post(`${API_BASE_URL}/upload`, {
                appid: 'wx123'
            });
            console.log('❌ 密钥验证未生效');
            return false;
        } catch (error) {
            if (error.response && error.response.status === 401) {
                console.log('✅ API密钥验证正常:', error.response.data.message);
            } else {
                console.error('❌ 意外错误:', error.message);
                return false;
            }
        }
        
        // 2. 测试无效API密钥
        try {
            await axios.post(`${API_BASE_URL}/upload`, {
                appid: 'wx123'
            }, {
                headers: {
                    'X-API-Key': 'invalid-key'
                }
            });
            console.log('❌ 无效密钥验证未生效');
            return false;
        } catch (error) {
            if (error.response && error.response.status === 403) {
                console.log('✅ 无效密钥验证正常:', error.response.data.message);
            } else {
                console.error('❌ 意外错误:', error.message);
                return false;
            }
        }
        
        // 3. 测试缺少参数（使用正确的API密钥）
        try {
            await axios.post(`${API_BASE_URL}/upload`, {
                appid: 'wx123'
                // 缺少其他必需参数
            }, {
                headers: {
                    'X-API-Key': API_SECRET_KEY
                }
            });
            console.log('❌ 参数验证未生效');
            return false;
        } catch (error) {
            if (error.response && error.response.status === 400) {
                console.log('✅ 参数验证正常:', error.response.data.message);
                return true;
            } else {
                console.error('❌ 意外错误:', error.message);
                return false;
            }
        }
        
    } catch (error) {
        console.error('❌ 验证测试失败:', error.message);
        return false;
    }
}

/**
 * 执行所有测试
 */
async function runAllTests() {
    console.log('========================================');
    console.log('微信小程序上传API测试开始');
    console.log('========================================\n');
    
    // 1. 健康检查测试
    const healthOk = await testHealth();
    console.log('');
    
    if (!healthOk) {
        console.log('❌ 服务未正常运行，请检查服务是否已启动');
        return;
    }
    
    // 2. 参数验证测试
    const validationOk = await testValidation();
    console.log('');
    
    // 3. 上传测试（这个需要真实的密钥和codecopy目录）
    console.log('⚠️  上传测试需要真实的密钥和codecopy目录');
    console.log('⚠️  请修改testData中的参数后再运行上传测试');
    console.log('');
    
    // 如果要测试真实上传，取消下面的注释
    // const uploadOk = await testUpload();
    
    console.log('========================================');
    console.log('测试完成');
    console.log('========================================');
}

// CURL命令示例
function showCurlExamples() {
    console.log('\n📋 CURL命令示例:\n');
    
    console.log('1. 健康检查:');
    console.log(`curl -X GET ${API_BASE_URL}/health\n`);
    
    console.log('2. 上传小程序代码:');
    console.log(`curl -X POST ${API_BASE_URL}/upload \\`);
    console.log(`  -H "Content-Type: application/json" \\`);
    console.log(`  -H "X-API-Key: ${API_SECRET_KEY}" \\`);
    console.log(`  -d '{`);
    console.log(`    "appid": "wx1234567890abcdef",`);
    console.log(`    "privateKey": "-----BEGIN PRIVATE KEY-----\\n...\\n-----END PRIVATE KEY-----",`);
    console.log(`    "backendDomain": "api.example.com",`);
    console.log(`    "uniacid": 123,`);
    console.log(`    "entryPagePath": "pages/index/index"`);
    console.log(`  }'\n`);
}

// Postman测试示例
function showPostmanExample() {
    console.log('📬 Postman测试配置:\n');
    console.log('URL:', `${API_BASE_URL}/upload`);
    console.log('Method: POST');
    console.log('Headers:');
    console.log('  Content-Type: application/json');
    console.log(`  X-API-Key: ${API_SECRET_KEY}`);
    console.log('Body (raw JSON):');
    console.log(JSON.stringify(testData, null, 2));
    console.log('');
}

// 根据命令行参数执行不同操作
const args = process.argv.slice(2);

if (args.includes('--help') || args.includes('-h')) {
    console.log('Usage: node test-upload.js [options]');
    console.log('Options:');
    console.log('  --curl     显示CURL命令示例');
    console.log('  --postman  显示Postman测试配置');
    console.log('  --test     运行API测试');
    console.log('  --help     显示帮助信息');
} else if (args.includes('--curl')) {
    showCurlExamples();
} else if (args.includes('--postman')) {
    showPostmanExample();
} else {
    runAllTests();
}

module.exports = {
    testHealth,
    testUpload,
    testValidation
}; 